#include "readers_writers.h"

void initRW()
{
	rc = 0;
	wc = 0;
	sem_init(&Rmutex,0,1);
	sem_init(&Wmutex,0,1);
	sem_init(&Mutex2,0,1);
	sem_init(&Rdb,0,1);
	sem_init(&Wdb,0,1);
}

void readerStart(void)
{
  sem_wait(&Mutex2);
  	sem_wait(&Rdb);
        sem_wait(&Rmutex);
           rc = rc + 1;
           if(rc == 1)
              sem_wait(&Wdb);
	   sem_post(&Rmutex);
	sem_post(&Rdb);
  sem_post(&Mutex2);

}

void readerEnd(void)
{
  sem_wait(&Rmutex);
  rc = rc - 1;
  if(rc == 0)
    sem_post(&Wdb);
  sem_post(&Rmutex);
}

void writerStart(void)
{
  sem_wait(&Wmutex);
  wc = wc + 1;
  if (wc == 1)
	sem_wait(&Rdb);
  sem_post(&Wmutex);
  sem_wait(&Wdb);
}

void writerEnd(void)
{
  sem_post(&Wdb);
  sem_wait(&Wmutex);
  wc=wc-1;
  if (wc == 0)
	sem_post(&Rdb);
  sem_post(&Wmutex);
}

void killRW(void)
{
	sem_destroy(&Rmutex);
	sem_destroy(&Wmutex);
	sem_destroy(&Mutex2);
	sem_destroy(&Rdb);
	sem_destroy(&Wdb);
}
